// 封装的axios请求
import axios from 'axios'
import bigInt from 'json-bigint'
import { getLocal, removeLocal } from '@/utils/local.js'
import { Toast } from 'vant'
import router from '@/router/index.js'
// 自定义配置_fetch的axios实例
const _fetch = axios.create({
  baseURL: process.env.VUE_APP_URL,
  transformResponse: [
    function (data) {
      // 处理精度超出最大值问题
      return bigInt.parse(data)
    }
  ]
})

// 添加请求拦截器
_fetch.interceptors.request.use(
  function (config) {
    // console.log('request', config)
    // 判断是否需要添加authorization,为true,需要添加
    const needToken = config.needToken
    // 判断当前的是否需要在请求头添加方法
    if (needToken) {
      // 获取当前的token
      const token = getLocal()
      // 在发送前带上 token
      config.headers.authorization = `Bearer ${token}`
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
_fetch.interceptors.response.use(
  function (response) {
    // 因为服务器status都是200, 所以我们根据返回的code来判断是否报错,并处理报错信息
    // console.log('response', response)
    // 只返回code为200的数据(也就是只返回正确的数据)
    if (response.data.code === 200) {
      return response.data
      // 未登录
    } else if (response.data.code === 403 || response.data.code === 401) {
      // 删除本地token
      removeLocal()
      // 提示用户未登录
      Toast.fail('未登录,请先登录')
      // 跳转到登录页面
      router.push('/loginCheck')
      // 数据不返回,提交到reject处理
      return Promise.reject(response.data.message)
    } else {
      Toast.fail(response.data.message)
      return Promise.reject(response.data.message)
    }
  },
  function (error) {
    // 对响应错误做点什么
    return Promise.reject(error)
  }
)

export { _fetch }
